//
// Created by Administrator on 2020/7/26.
//T6章:继承与派生
//派生类复制构造函数
//(1)派生类未定义复制构造函数的情况
//  A-编译器会在需要时生成一个隐含的复制构造函数；
//  B-先调用基类的复制构造函数；
//  C-再为派生类新增的成员执行复制。
//(2)派生类定义了复制构造函数的情况
//  A-一般都要为基类的复制构造函数传递参数。
//  B-复制构造函数只能接受一个参数，既用来初始化派生类定义的成员，也将被传递给基类的复制构造函数。
//  C-基类的复制构造函数形参类型是基类对象的引用，实参可以是派生类对象的引用
//  D-例如: C::C(const C &c1): B(c1) {…}

//派生类的析构函数
//  A-析构函数不被继承，派生类如果需要，要自行声明析构函数。
//  B-声明方法与无继承关系时类的析构函数相同。
//  C-不需要显式地调用基类的析构函数，系统会自动隐式调用。
//  D-先执行派生类析构函数的函数体，再调用基类的析构函数。
//派生类对象析构举例
#include <iostream>
using namespace std;
//----------------基类Base1---------------//
class Base1
{
public:
    Base1(int i){ cout << "Constructing Base1 " << i << endl;}
    ~Base1() { cout << "Destructing Base1" << endl; }
};
//----------------类Base2---------------//
class Base2
{
public:
    Base2(int j){cout << "Constructing Base2 " << j << endl;}
    ~Base2() { cout << "Destructing Base2" << endl; }
};
//----------------类Base3---------------//
class Base3
{
public:
    Base3() { cout << "Constructing Base3 *" << endl; }
    ~Base3() { cout << "Destructing Base3" << endl; }
};
//----------------派生Derived类---------------//
class Derived: public Base2, public Base1, public Base3
{
public:
    Derived(int a, int b, int c, int d): Base1(a), member2(d), member1(c), Base2(b){ }
private:
    Base1 member1;
    Base2 member2;
    Base3 member3;
};
//----------------main---------------//
int main() {
    Derived obj(1, 2, 3, 4);
    return 0;
}
